home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / gfx / edit / AmiCAD_2.06.lha / AmiCAD / ARexx / SaveNets.AmiCAD < prev    next >
Text File  |  2000-04-15  |  12KB  |  466 lines

  1. /* Élaboration d'une netlist, appel simulateur analogique Spice
  2.    Version 1.00: 14-07-98
  3.    Version 1.01: 16-02-99 (modif ASKTEXT)
  4.    Version 1.02: 21/02/99 (modif REQFILE, ajout UNLOCK)
  5.    Version 1.03: 27/02/99 (ajout INIT variables)
  6.    Version 1.04: 29/05/99 (ajout signal si absence de masse)
  7.    Version 1.05: 06/06/99 (ajout traitement .OUTPUT)
  8.    Version 1.06: 04/10/99 (ajout point de fonctionnement)
  9.    Version 1.07: 13/04/00 (adaptation à la version 2.05)
  10.    Ne teste que les lignes horizontales ou verticales (pour les intersections)
  11.    $VER: SaveNets 1.07 (© R.Florac, 13/04/00) */
  12.  
  13. options results     /* indispensable pour récupérer le résultat des macros */
  14.  
  15. signal on error     /* pour l'interception des erreurs */
  16. signal on syntax
  17.  
  18. call 'ARexx/InitObjets.AmiCAD'
  19.  
  20. /* Test des liaisons */
  21. j=1; nets=1;
  22. 'DEF NEXTJUNCTION(O)=OO=O:WHILE(IF(OO>0,TYPE(OO)<>7,0),IF(OO<OBJECTS,OO=OO+1,OO=0)):OO'
  23. 'INIT(O,OO,I,X,V0,V1,B):UNMARK(-1):LOCK:OBJECTS'; objets=result
  24. /* Tableaux de données:
  25. equi: une donnée par élément, donne l'indice de l'équipotentielle à laquelle est liée une ligne
  26. label: une donnée par équipotentielle, donne son nom */
  27. equi.=-1
  28. label.=""
  29.  
  30. 'TITLE("Lecture des labels...")'
  31. do i=1 to objets
  32.     'TYPE(O='i')'
  33.     if result=4 | result=12 | result=11 then do
  34.     'ABS(FINDLINE(1,COL(O),LINE(O)))'; j=result
  35.     if j>0 then do
  36.         'READTEXT(O)'; label=result
  37.         if datatype(label,"w") then do      /* signale les labels numériques existants */
  38.         label.label="LABEL_DÉJÀ_UTILISÉ"
  39.         end
  40.     end
  41.     end
  42. end
  43.  
  44. 'TITLE("Analyse des liaisons...")'
  45. i=1
  46. do while i>0
  47.     'OO=FINDOBJ('i',FIL,-1,-1)'; i=result
  48.     if result>0 then do
  49.     'TEST(OO)'
  50.     if result=0 then do
  51.         do while label.nets~=""
  52.         nets=nets+1
  53.         end
  54.         label.nets=nets
  55.         equi.i=nets
  56.         'COORDS(OO)'            /* Marquage du fil */
  57.         parse var result x0','y0','x1','y1
  58.         call test_ligne(x0,y0,nets,objets)
  59.         call test_ligne(x1,y1,nets,objets)
  60.     end
  61.     if i=objets then i=0
  62.     else i=i+1
  63.     end
  64. end
  65.  
  66. 'TITLE("Analyse des jonctions...")'
  67. i=1
  68. do while i>0
  69.     'I=FINDOBJ('i',JONCTION,-1,-1)'; i=result
  70.     if i>0 then do
  71.     'MARK(I):L1=ABS(FINDLINE(1,COL(I),LINE(I)))'; l1=result
  72.     if l1>0 & l1<objets then do
  73.         j=l1+1
  74.         do while j>0
  75.         'J=ABS(FINDLINE('j',COL(I),LINE(I)))'; j=result
  76.         if j>0 then do
  77.             if equi.j~=equi.l1 then do
  78.             call changer_labels(l1,j)
  79.             end
  80.             if j=objets then j=0
  81.             else j=j+1
  82.         end
  83.         end
  84.     end
  85.     if i=objets then i=0
  86.     else i=i+1
  87.     end
  88. end
  89.  
  90. 'TITLE("Recherche des labels et des connecteurs...")'
  91. do i=1 to objets
  92.     'TYPE(O='i')'
  93.     if result=4 | result=12 | result=11 then do
  94.     'ABS(FINDLINE(1,COL(O),LINE(O)))'; j=result
  95.     if j>0 then do
  96.         net=equi.j
  97.         'READTEXT(O)'; label=result
  98.         label.net=label
  99.     end
  100.     end
  101. end
  102.  
  103. 'TITLE("Recherche des alimentations...")'
  104. do i=1 to objets
  105.     'FINDPART('i',"ALIMENTATION")'; i=result
  106.     if i>0 then do
  107.     j=connexion_broche(i,1)
  108.     if j>0 then do
  109.         net=equi.j
  110.         'READTEXT(GETVAL('i'))'; label=result
  111.         label.net=label
  112.     end
  113.     end
  114.     else leave
  115. end
  116.  
  117. 'TITLE("Test redondances...")'
  118. do i=1 to nets
  119.     do j=i+1 to nets
  120.     if label.j~="" then do
  121.         if label.i=label.j then do
  122.         do k=1 to objets
  123.             if equi.k=j then equi.k=i
  124.         end
  125.         label.j=""
  126.         end
  127.     end
  128.     end
  129. end
  130.  
  131. 'TITLE("Recherche des masses...")'
  132. do i=1 to objets
  133.     'FINDPART('i',"MASSE")'; i=result
  134.     if i>0 then do
  135.     j=connexion_broche(i,1)
  136.     if j>0 then do
  137.         equi.0=0; label.0=0
  138.         call changer_labels(0,j)
  139.     end
  140.     end
  141.     else leave
  142. end
  143.  
  144. masse=0
  145. do i=0 to nets
  146.     if label.i=0 then do
  147.     masse=1
  148.     leave i
  149.     end
  150. end
  151.  
  152. if masse=0 then do
  153.     'REQUEST("Attention: le circuit"+CHR(10)+"ne possède pas de masse!"+CHR(10)+"Sa simulation sera impossible"+CHR(10)+"Voulez-vous continuer?")'
  154.     if result<1 then exit
  155. end
  156.  
  157. do until c=0
  158.     'TITLE("Établissement équipotentielles terminé"):SELECT("Choisissez une action"+CHR(10)+"Visualiser les équipotentielles"+CHR(10)+"Contrôler la netlist"+CHR(10)+"Sauver la netlist"+CHR(10)+"Abandonner ce script")'
  159.     select
  160.     when result=1 then call visu_equi
  161.     when result=2 then call controler_netlist
  162.     when result=3 then call sauver_netlist
  163.     otherwise c=0
  164.     end
  165. end
  166. 'UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  167. exit
  168.  
  169. visu_equi:
  170.     'TITLE("Vérification équipotentielles"):UNMARK(-1)'
  171.     do i=0 to nets
  172.     if label.i ~= "LABEL_DÉJÀ_UTILISÉ" & label.i ~= "" then do
  173.         do j=1 to objets
  174.         if equi.j=i then 'MARK('j')'
  175.         end
  176.         'SELECT("Équipotentielle 'label.i'"+CHR(10)+"Abandonner"+CHR(10)+"Continuer"+CHR(10)+"Sauver netlist"+CHR(10)+"Contrôler netlist")'
  177.         if result <= 1 then return
  178.         if result = 3 then do
  179.         call sauver_netlist
  180.         'UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  181.         exit
  182.         end
  183.         if result = 4 then do
  184.         call controler_netlist
  185.         leave
  186.         end
  187.         'UNMARK(-1)'
  188.     end
  189.     end
  190.     return
  191.  
  192. test_ligne: procedure expose equi.
  193.     parse arg x0,y0,n,nbo
  194.     o=1
  195.     do until o=0
  196.     'X=FINDOBJ('o',FIL,'x0','y0')'; o=result
  197.     if o>0 then do
  198.         'IF(TEST(X),"",MARK(X):COORDS(X))'
  199.         if result~="" then do
  200.         parse var result x1','y1','x2','y2
  201.         equi.o=n
  202.         if x0=x1 & y0=y1 then call test_ligne(x2,y2,n,nbo)
  203.         else call test_ligne(x1,y1,n,nbo)
  204.         end
  205.         if o=nbo then o=0
  206.         else o=o+1
  207.     end
  208.     end
  209.     return
  210.  
  211. changer_labels: procedure expose equi. objets label.
  212.     parse arg o1,o2
  213.     if datatype(equi.o2,'w') then do
  214.     e=equi.o2
  215.     label.e=""
  216.     do i=1 to objets
  217.         if equi.i=e then equi.i=equi.o1
  218.     end
  219.     return o1
  220.     end
  221.     else do
  222.     e=equi.o1
  223.     label.e=""
  224.     do i=1 to objets
  225.         if equi.i=e then equi.i=equi.o2
  226.     end
  227.     return o2
  228.     end
  229.     return
  230.  
  231. test_jonction: procedure expose equi.
  232.     parse arg xj,yj,n,objets
  233.     obj=1
  234.     do while obj>0
  235.     'X=ABS(FINDLINE('obj','xj','yj'))'; obj=result
  236.     if obj>0 then do
  237.         if equi.obj=n then return 1
  238.         if obj=objets then return 0
  239.         obj=obj+1
  240.     end
  241.     end
  242.     return 0
  243.  
  244. controler_netlist:
  245.     'TITLE("Contrôle netlist...")'
  246.     i=1
  247.     do while i>0
  248.     'O=FINDOBJ('i',COMPOSANT,-1,-1)'; i=result
  249.     if i>0 then do
  250.         'PARTNAME(O)'
  251.         if result~="ALIMENTATION" & result ~="MASSE" then do
  252.         'IF(GETREF(O),READTEXT(GETREF(O)),PARTNAME(O)+"?")'
  253.         ligne=translate(result,"_"," ")||' '
  254.         'DEVPINS(O)'; j=result
  255.         do k=1 to j
  256.             l=connexion_broche(i,k)
  257.             if l>0 then do
  258.             net=equi.l
  259.             ligne=ligne||label.net||' '
  260.             end
  261.             else ligne=ligne||"-1"||' '
  262.         end
  263.         'IF(GETVAL(O),READTEXT(GETVAL(O)),PARTNAME(O))'
  264.         ligne=ligne||result
  265.         'UNMARK(-1):MARK(O):SELECT("'ligne'"+CHR(10)+"Continuer"+CHR(10)+"Abandonner")'
  266.         if result~=1 then return
  267.         end
  268.         if i=objets then leave
  269.         i=i+1
  270.     end
  271.     end
  272.     'TITLE("")'
  273. return
  274.  
  275. sauver_netlist:
  276.     'TITLE(""):REQFILE("Fichier netlist à créer","Spice",FILEPART("")+".cir")'
  277.     fichier=result
  278.     if fichier="" then return
  279.     'TITLE("Sauvegarde netlist...")'
  280.     if ~open(file, fichier, 'W') then return
  281.     'FILEPART("")'
  282.     writeln(file,result)
  283.     'DATE(1)+" à "+TIME(1)'
  284.     writeln(file,"* Créé par AmiCAD, le "||result||" *")
  285.     writeln(file,".include Travail:Spice3f5/lib/modeles.cir")
  286.     do i=1 to objets
  287.     'O=FINDOBJ('i',COMPOSANT,-1,-1)'; i=result
  288.     if result>0 then do
  289.         'PARTNAME(O)'
  290.         if result~="ALIMENTATION" & result ~="MASSE" then do
  291.         'IF(GETREF(O),READTEXT(GETREF(O)),PARTNAME(O)+"?")'
  292.         ligne=translate(result,"_"," ")||' '
  293.         'DEVPINS(O)'; j=result
  294.         do k=1 to j
  295.             l=connexion_broche(i,k)
  296.             if l>0 then do
  297.             net=equi.l
  298.             ligne=ligne||label.net||' '
  299.             end
  300.             else ligne=ligne||"-1"||' '
  301.         end
  302.         'IF(GETVAL(O),READTEXT(GETVAL(O)),PARTNAME(O))'
  303.         ligne=ligne||result
  304.         call writeln(file, ligne)
  305.         end
  306.     end
  307.     else leave i
  308.     end
  309.     analyse=""
  310.     do i=1 to objets
  311.     'FINDOBJ('i',TEXTE,-1,-1)'; i=result
  312.     if i>0 then do
  313.         'READTEXT('i')'; t=result
  314.         if left(t,10)=".ANALYSE: " then do
  315.         analyse=substr(t,11)
  316.         end
  317.     end
  318.     else leave
  319.     end
  320.     if analyse="" then do
  321.     'SELECT("Type d''analyse à effectuer"+CHR(10)+"Point de fonctionnement"+CHR(10)+"AC"+CHR(10)+"DC"+CHR(10)+"Transient")'
  322.     select
  323.         when result=1 then do
  324.         analyse="OP"
  325.         end
  326.         when result=2 then do
  327.         'SELECT("Type de variation"+CHR(10)+"Décade"+CHR(10)+"Octave"+CHR(10)+"Linéaire")'
  328.         select
  329.             when result=1 then do
  330.             f="DEC "; v="par décade"
  331.             end
  332.             when result=2 then do
  333.             f="OCT "; v="par octave"
  334.             end
  335.             when result=3 then do
  336.             f="LIN "; v="de test"
  337.             end
  338.             otherwise do
  339.             close(file)
  340.             return
  341.             end
  342.         end
  343.         'ASKNUM("Nombre de points 'v'?",100)'
  344.         f=f||result
  345.         'ASKTEXT("Quelle est la fréquence de début?","10")'
  346.         f=f||" "||result
  347.         'ASKTEXT("Quelle est la fréquence de fin?","100")'
  348.         analyse="AC "||f||' '||result
  349.         end
  350.         when result=3 then do
  351.         'UNMARK(-1):MESSAGE("Vous devez maintenant"+CHR(10)+"sélectionner une source")'
  352.         'PICKOBJ("Sélectionnez le générateur à faire varier.")'
  353.         f=result
  354.         if f<1 then return
  355.         'MARK('f'):TYPE('f')'
  356.         if result=5 then 'READTEXT('f')'
  357.         else 'READTEXT(GETREF('f'))'
  358.         f=result
  359.         'V0=ASKTEXT("Quelle est la valeur de départ?","V")'
  360.         f=f||' '||result
  361.         'V1=ASKTEXT("Quelle est la valeur finale.","V")'
  362.         f=f||' '||result
  363.         'ASKTEXT("Quel est l''incrément?",STR((VAL(V1)-VAL(V0))/100)+"V")'
  364.         analyse="DC "||f||' '||result
  365.         end
  366.         when result=4 then do
  367.         'ASKTEXT("Temps de simulation?","s")'; temps=result
  368.         'ASKTEXT("Pas de simulation?","s")'; pas=result
  369.         'ASKTEXT("Temps de début de la simulation?","s")'; d=result
  370.         analyse="tran "||pas||" "||temps||" "||d
  371.         end
  372.         otherwise
  373.         return
  374.     end
  375.     end
  376.     if analyse~="" then writeln(file,"."||analyse)
  377.     i=1
  378.     s=''
  379.     do i=1 to objets
  380.     'FINDOBJ('i',TEXTE,-1,-1)'; i=result
  381.     if i>0 then do
  382.         'READTEXT('i')'; t=result
  383.         if left(t,9)=".OUTPUT: " then do
  384.         s=substr(t,9)
  385.         end
  386.     end
  387.     else leave
  388.     end
  389.     if s='' then do
  390.     'UNMARK(-1):MESSAGE("Vous pouvez maintenant"+CHR(10)+"spécifier quels sont les"+CHR(10)+"signaux à visualiser"+CHR(10)+"Appuyez sur le bouton"+CHR(10)+"droit pour arrêter")'
  391.     i=1
  392.     do while i>0
  393.         'PICKOBJ("Sélectionnez un signal (label ou liaison)")'
  394.         i=result
  395.         if i>0 then do
  396.         'MARK('i'):TYPE('i')'; t=result
  397.         if t=2 then do
  398.             lab=equi.i
  399.             lab=label.lab
  400.         end
  401.         else do
  402.             'READTEXT('i')'
  403.             lab=result
  404.         end
  405.         if i>0 then s=s||' '||'V('||lab||')'
  406.         end
  407.     end
  408.     end
  409.     if s~='' then writeln(file,".save"||s)
  410.     writeln(file,".END")
  411.     close(file)
  412.     'TITLE(""):REQUEST("Sauvegarde terminée"+CHR(10)+"Voulez-vous effectuer"+CHR(10)+"la simulation?")'
  413.     if result=1 then do
  414.     if analyse ~= "OP" then do
  415.         'REXXPORT("Tracé "+FILEPART(""))'
  416.         port=result
  417.         if port="" then do
  418.         'FILEPART("")'
  419.         call 'Travail:AmiCAD/ARexx/NewWindow' 'Tracé '||result
  420.         code=result
  421.         if code < 0 then do
  422.             'MESSAGE("Ouverture fenêtre tracé impossible"):UNLOCK'
  423.             exit
  424.         end
  425.         port = 'AmiCAD.'||code
  426.         end
  427.         'UNLOCK'
  428.         address value port
  429.     end
  430.     else port=""
  431.     call 'Travail:AmiCAD/ARexx/Simulation.AmiCAD' fichier
  432.     call 'Travail:AmiCAD/ARexx/TracerSpice.AmiCAD' '"RAM:'||ParseFileName(fichier)||'_spice"'port
  433.     exit
  434.     end
  435. return
  436.  
  437. connexion_broche: procedure
  438.     parse arg objet,broche
  439.     'PINCOL(O='objet',B='broche')'; xj=result
  440.     'PINLINE(O,B)'; yj=result
  441.     'FINDOBJ(1,FIL,'xj','yj')'; xl=result   /* Il y a t'il une ligne qui part de la broche? */
  442.     if xl>0 then return xl
  443.     'FINDLINE(1,'xj','yj')'; xl=result      /* Il y a peut être une ligne qui passe sur la broche... */
  444.     if xl<=0 then return 0
  445.     'FINDOBJ(1,JONCTION,'xj','yj')'         /* Il doit alors y avoir une jonction */
  446.     if result>0 then return xl
  447.     return 0
  448.  
  449. ParseFileName: procedure
  450.     parse arg FilePath, Part
  451.     DivPos = max(lastpos(':',FilePath),lastpos('/',FilePath))+1
  452.     if abbrev('FILE', upper(Part))
  453.     then return substr(FilePath, DivPos)
  454.     else
  455.     return strip(left(FilePath, DivPos-1),'T','/')
  456.  
  457. /* Traitement des erreurs, interruption du programme */
  458. syntax:
  459. erreur=RC
  460. 'MESSAGE("Script SaveNets.AmiCAD"+CHR(10)+"Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  461. exit
  462.  
  463. error:
  464. 'MESSAGE("Script SaveNets.AmiCAD"+CHR(10)+"Erreur en ligne 'SIGL'"):UNLOCK:INIT(O,OO,I,X,V0,V1,B)'
  465. exit
  466.